#include "dirStack.h"

void _dirStack_init(_dirStack_t* s) {
    bzero(s->_stack, 1024 * sizeof(char*));
    s->_top = -1;
}

bool _dirStack_empty(_dirStack_t* s){
    return s->_top == -1;
}

int _dirStack_push(_dirStack_t* s, char* token){
    if(token == NULL){
        fprintf(stderr, "push NULL.\n");
        return -1;
    }
    char* tmp = (char*)calloc(strlen(token), sizeof(char));
    ERROR_CHECK(tmp, NULL, "_dirStack_push calloc");
    strncpy(tmp, token, strlen(token));
    s->_stack[++s->_top] = tmp;
    return 0;
}

int _dirStack_pop(_dirStack_t* s){
    if(_dirStack_empty(s)){
        fprintf(stderr, "pop in empty stack.\n");
        return 1;
    }
    free(s->_stack[s->_top]);
    s->_stack[s->_top] = NULL;  
    --s->_top;
    return 0;
}

char* _dirStack_top(_dirStack_t* s){
    if(_dirStack_empty(s)){
        fprintf(stderr, "get top from empty stack.\n");
        return NULL;
    }
    return s->_stack[s->_top];
}

char* _dirStack_getDir(_dirStack_t* s){
    char* str = (char*)calloc(4096, sizeof(char));
    int n = s->_top;
    for(int i = 0;i <= n; ++i){
        strcat(str, s->_stack[i]);
        strcat(str, "/");
    }
    return str;
}

int _dirStack_copy(_dirStack_t* dest, const _dirStack_t* src){
    dest->_top = src->_top;
    for(int i = 0;i <= src->_top; ++i){
        if(src->_stack[i] == NULL){
            dest->_stack[i] = NULL;
        }
        dest->_stack[i] = strdup(src->_stack[i]);
    }
    return 1;
}

//----------------------------test-----------------------------------------------------------

/* // 测试函数：测试目录栈各个功能 */
/* void test_dirStack() { */
/*     _dirStack_t stack; */
/*     _dirStack_init(&stack); */

/*     // 测试1：初始化后栈应为空 */
/*     printf("测试1：初始化后，栈是否为空？ %s\n", _dirStack_empty(&stack) ? "是" : "否"); */

/*     // 测试2：压入元素 */
/*     printf("\n测试2：依次压入元素 'home', 'user', 'documents'\n"); */
/*     _dirStack_push(&stack, "home"); */
/*     _dirStack_push(&stack, "user"); */
/*     _dirStack_push(&stack, "documents"); */

/*     // 测试3：栈不为空，检查栈顶元素 */
/*     printf("压入后，栈是否为空？ %s\n", _dirStack_empty(&stack) ? "是" : "否"); */
/*     printf("当前栈顶元素：%s\n", _dirStack_top(&stack)); */

/*     // 测试4：获取拼接的目录字符串 */
/*     char *curDir = _dirStack_getDir(&stack); */
/*     printf("拼接的目录路径：%s\n", curDir); */
/*     free(curDir); */

/*     // 测试5：弹出栈顶元素 */
/*     printf("\n测试5：弹出栈顶元素...\n"); */
/*     _dirStack_pop(&stack); */
/*     printf("弹出后，当前栈顶元素：%s\n", _dirStack_top(&stack)); */

/*     // 测试6：复制栈 */
/*     printf("\n测试6：复制栈...\n"); */
/*     _dirStack_t copyStack; */
/*     _dirStack_init(&copyStack); */
/*     _dirStack_copy(&copyStack, &stack); */
/*     printf("复制栈后的栈顶元素：%s\n", _dirStack_top(&copyStack)); */
/*     char *copyDir = _dirStack_getDir(&copyStack); */
/*     printf("复制栈拼接的目录路径：%s\n", copyDir); */
/*     free(copyDir); */

/*     // 测试7：弹出剩余所有元素，使栈为空 */
/*     printf("\n测试7：依次弹出剩余元素...\n"); */
/*     _dirStack_pop(&stack); */
/*     _dirStack_pop(&stack); */
/*     printf("全部弹出后，栈是否为空？ %s\n", _dirStack_empty(&stack) ? "是" : "否"); */

/*     // 测试8：尝试从空栈弹出元素（错误情况） */
/*     printf("\n测试8：从空栈中弹出元素：\n"); */
/*     _dirStack_pop(&stack); */
/* } */

/* int main() { */
/*     test_dirStack(); */
/*     return 0; */
/* } */
